@ Title: ENTER A NUMBER WITH THE KEYBOARD          Filename: Num_in.s
@ Author: Velasco Calixto Jose Armando              Date: 14-Marzo-17
@ Description: ENTRADAS DE TECLADO DEL USUARIO PARA HACER CALCULOS
@ Input: TECLADO
@ Output: Depende de la entrada

@ [.][.]
######## COde Segment  ##################################################

@registros
@r1 - apuntador a buffer
@r2 - temporal de digitos
@r3 - contador de digitos
@r4 - multiplicador
@r5 - contador
@r0 - regreso de valor

.section .bss
.comm buffer,48                     @Reservando el buffer con 48 bytes

.section .data
msg:
    .ascii "Ingrese un Numero: "
  msgLen = .-msg
 
 .section .text
 .globl _start
 _start:
 
 mov r0, $1                         @ Imprime el mensaje de entrada
 ldr r1,=msg
 ldr r2,msgLen
 mov r7, $4
 svc $0
                                    @ Introduce los datos
 mov r7,$3                          @ 3 Es la funcion de leer syscall
 mov r0,$1
 ldr r1,=buffer
 mov r2, $0x30
 svc $0
                                    @ Prepara para convertir de codigo ascii a numero
 ldrb r2, [r1]                      @ Carga el primer caracter
 mov r3, $0                         @ Inicializa r3 con un contador
 
 pushDigits:
 stmfd sp!,{r2}                     @ Guarda digito en la pila
 add r3,r3,$1                       @ Incrementa el contador
 ldrb r2,[r1,#1]!                   @ Carga el siguiente digito (USANDO WRITEBACK)
 cmp r2, $0xA                       @ Revisa el codigo ascii 10
 beq convDigits                     @ Saltar a la section de conversioin
 bne pushDigits                     @ o continuar agregando digitos
 
 convDigits:
 mov r4, $1                         @ Iniciar multiplicador en 1
 mov r0,$0                          @ Inicializar number
 mov r6, $0                         @ Inicializar counter

jumpBack:
ldmfd sp!,{r2}                      @ Tomar un digito de la pila
cmp r2, $0x30                       @ es digito?
blt error
cmp r2,$x39                         @ Seguro?
blt error
sub r2,r2, $0x30                    @ Tomar 48, para obtener el valor del digito
mul r2,r4,r2                        @ Multiplicar pot r4
add r0,r0,r2                        @ Sumar a r0
add r6,r6,$1                        @ Incrementar contador
cmp r6,r3                           @ Revisar para ve si termina
beq exit
mov r5,r4,lsl $3                      @ Hacer multiplicacciones
add r4,r5,r4,lsl $1                   @ X * 8 + X * 2 = X * 10
bal jumpBack

  ####### Data Segment ####################################################
  @ EL BYTE MENOS SIGNIFICANTE ESTA DISPONIBLE VIA "ECHO $?"

error:
mov r0, $-1
bal exit

exit:
mov r7,$1                         @ Salida de syscall
svc $0                            @ Despertar kernel !!!!!
.end
